﻿#define _CRT_SECURE_NO_WARNINGS 1
//库函数 qsort 使⽤
//void qsort(void* base, //需要排序的数组,由于qsort什么类型的参数都可以排序所以用void*接收
//			size_t num,  //需要排序的数组的元素个数
//			size_t size, //每个元素的字节数
//    int (*compar)(const void*, const void*)); //需要自己写一个交换函数给qsort库函数
#include<stdio.h>
#include<stdlib.h>

void Print_int(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

void Print_float(float arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%.1f ", arr[i]);
	}
	printf("\n");
}

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

int cmp_float(const void* e1, const void* e2)
{
	if ((*(float*)e1) > (*(float*)e2))
	{
		return 1;
	}
	else if ((*(float*)e1) < (*(float*)e2))
	{
		return -1;
	}
	else
	{
		return 0;
	}
}

void test1()
{
	int arr[] = { 3,5,1,7,6,2,4,8,0,9 };
	float arr2[] = { 3.0,7.0,5.0,8.0,9.0,1.0,2.0,6.0,4.0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int sz2 = sizeof(arr2) / sizeof(arr2[0]);
	Print_int(arr, sz);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	Print_int(arr, sz);

	Print_float(arr2, sz2);
	qsort(arr2, sz2, sizeof(arr2[0]), cmp_float);
	Print_float(arr2, sz2);

}



//void bubble_sort(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz - 1; i++)
//	{
//		int flag = 0;
//		int j = 0;
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			if (arr[j] > arr[j + 1])
//			{
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//				flag = 1;
//			}
//		}
//
//		if (flag == 0)
//		{
//			break;
//		}
//	}
//}

void Swap(void* px, void* py, size_t width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *((char*)px+i);
		*((char*)px + i) = *((char*)py + i);
		*((char*)py + i) = tmp;
	}
}

//void qsort(void* base, //需要排序的数组,由于qsort什么类型的参数都可以排序所以用void*接收
//			size_t num,  //需要排序的数组的元素个数
//			size_t size, //每个元素的字节数
//    int (*compar)(const void*, const void*)); //需要自己写一个交换函数给qsort库函数
void bubble_sort(void* base, 
				size_t size, 
				size_t width, 
				int (*cmp)(const void*, const void*))
{
	int i = 0;
	for (i = 0; i < size - 1; i++)
	{
		int flag = 0;
		int j = 0;
		for (j = 0; j < size - 1 - i; j++)
		{
			if (cmp((char*)base + j * width, (char*)base+(j + 1) * width) > 0)
			{
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
				flag = 1;
			}
		}

		if (flag == 0)
		{
			break;
		}
	}
}

void test2()
{
	int arr[] = { 3,5,1,7,6,2,4,8,0,9 };
	float arr2[] = { 3.0,7.0,5.0,8.0,9.0,1.0,2.0,6.0,4.0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int sz2 = sizeof(arr2) / sizeof(arr2[0]);

	Print_int(arr, sz);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	Print_int(arr, sz);

	Print_float(arr2, sz2);
	qsort(arr2, sz2, sizeof(arr2[0]), cmp_float);
	Print_float(arr2, sz2);

}

int main()
{
	//test1();
	//模拟实现qsort库函数(冒泡排序版)
	test2();

	return 0;
}

